\input{Schnittstelle/utils}

\section{BitstreamStorageManager.java} % (fold)
\label{sec:sourcecode}
            
\minisec{Konfiguration und Initialisierung}
Hier sind die meisten Änderungen notwendig. Zum einen müssen die Parameter aus der dspace.cfg geladen werden: 

\begin{lstlisting}[caption={SRBAccount initialisieren},firstnumber=166]  
// see if conventional assetstore or srb
if (sAssetstoreDir != null) {
	stores.add(sAssetstoreDir); // conventional (non-srb)
} else if (ConfigurationManager.getProperty("srb.host") != null) {
	stores.add(new SRBAccount( // srb
	ConfigurationManager.getProperty("srb.host"),
	ConfigurationManager.getIntProperty("srb.port"),
	ConfigurationManager.getProperty("srb.username"),
	ConfigurationManager.getProperty("srb.password"),
	ConfigurationManager.getProperty("srb.homedirectory"),
	ConfigurationManager.getProperty("srb.mdasdomainname"),
	ConfigurationManager.getProperty("srb.defaultstorageresource"),
	ConfigurationManager.getProperty("srb.mcatzone")));
} else if (ConfigurationManager.getProperty("irods.host") != null) { // irods
	stores.add(new IRODSAccount(
	ConfigurationManager.getProperty("irods.host"),
	ConfigurationManager.getIntProperty("irods.port"),
	ConfigurationManager.getProperty("irods.username"),
	ConfigurationManager.getProperty("irods.password"),
	ConfigurationManager.getProperty("irods.homedirectory"),
	ConfigurationManager.getProperty("irods.mcatzone"),
	ConfigurationManager.getProperty("irods.defaultstorageresource")));
} else {
	log.error("No default assetstore");
}
\end{lstlisting}   

und als nächstes wird ein neues \emph{IRODSAccount} Objekt mit den Parametern der Konfiguration angelegt:

\begin{lstlisting}[caption={IRODSAccount erstellen},firstnumber=199] 
} else if (ConfigurationManager.getProperty("irods.host." + i) != null) { // irods
	stores
	.add(new IRODSAccount(
	ConfigurationManager.getProperty("irods.host." + i),
	ConfigurationManager.getIntProperty("irods.port." + i),
	ConfigurationManager.getProperty("irods.username." + i),
	ConfigurationManager.getProperty("irods.password." + i),
	ConfigurationManager.getProperty("irods.homedirectory." + i),
	ConfigurationManager.getProperty("irods.mcatzone." + i),
	ConfigurationManager.getProperty("irods.defaultstorageresource." + i)));
} else { 
\end{lstlisting}   

Dann wird die Verbindung zum IRODS über den \emph{IRODSAccount} hergestellt: 

\begin{lstlisting}[caption={Verbindung zu IRODS herstellen},firstnumber=282]  
} else if (o instanceof IRODSAccount) {
GeneralFileSystem irodsFileSystem = null;
try {
	log.debug("VERBINDE zum IRODS" ((IRODSAccount) o).getHost());
	irodsFileSystem = FileFactory.newFileSystem((GeneralAccount) o);
} catch (NullPointerException e) {
	log.error("No IRODSAccount for assetstore " + i);
} catch (IOException e) {
	log.error("Problem getting IRODSFileSystem for assetstore" + i);
} catch (Exception e) {
	log.error("Allgemeiner Fehler");
}
if (irodsFileSystem == null) {
	log.error("IRODS FileSystem is null for assetstore " + i);
}
String sIRODSAssetstore = null;
if (i == 0) { // the zero (default) assetstore has no suffix
	sIRODSAssetstore = ConfigurationManager.getProperty("irods.parentdir");
} else {
	sIRODSAssetstore = ConfigurationManager.getProperty("irods.parentdir." + i);
}
if (sIRODSAssetstore == null) {
	log.error("irods.parentdir is undefined for assetstore " + i);
}
assetStores[i] = FileFactory.newFile(irodsFileSystem,
		sIRODSAssetstore);
assetStores[i].mkdir();			
\end{lstlisting}  

\minisec{Speichern} % (fold)
\label{ssub:speichern}

% subsubsection speichern (end)   

Beim Speichern einer Datei muss schließlich im IRODS der Pfad vom DSPACE angelegt werden:

\begin{lstlisting}[caption={DSpace Pfad im IRODS anlegen},firstnumber=401]
if (file instanceof IRODSFile) {
 GeneralFile filebuff = null;
 for (int i = 0; i < 6; i = i + 2) {
 	String string = id.substring(i, i + 2);
 
 	if (i == 0)
 		filebuff = FileFactory.newFile(assetStores[0], string);
 	else
 		filebuff = FileFactory.newFile(filebuff, string);
 	filebuff.mkdir();
 }
\end{lstlisting} 

Dann müssen wir zur Zeit noch den Umweg über eine lokale Datei am Server gehen, da es beim Stringbuffer kopieren noch unerwartete Schwierigkeiten gab. Hier besteht noch Optimierungsbedarf. Der Weg über die lokale Datei ist für kleine Dateigrößen sicher unbedenklich. Jedoch wird dies bei sehr umfangreichen Dateigrößen zu Performance Engpässen führen.
      
\begin{lstlisting}[caption={Inhalt von File von LocalFile kopieren},firstnumber=421]
LocalFile tmp = new LocalFile("tmp");
LocalFileOutputStream out = new LocalFileOutputStream(tmp);
		
Utils.bufferedCopy(is, out);
		
file.copyFrom( tmp, true );
		
tmp.delete();
\end{lstlisting}
         
\minisec{Laden} % (fold)
\label{ssub:laden}

% subsubsection laden (end)
Um eine Datei wieder vom IRODS zu laden kommt folgende Ergänzung zum Tragen:
  
\begin{lstlisting}[caption={File aus dem IRODS auslesen},firstnumber=898] 
if (assetstore instanceof IRODSFile) {
   bufFilename.append(sIntermediatePath);
   bufFilename.append(sInternalId);
   if (log.isDebugEnabled()) {
   	log.debug("IRODS filename for " + sInternalId + " is "
   			+ ((IRODSFile) assetstore).toString()
   			+ bufFilename.toString());
   }
   return FileFactory.newFile((IRODSFile) assetstore, bufFilename
   		.toString());         
\end{lstlisting}
% section sourcecode (end)